css shadows: Exit early if clip is empty
authorAlexander Larsson <alexl@redhat.com>
Mon, 6 May 2013 10:34:09 +0000 (12:34 +0200)
committerAlexander Larsson <alexl@redhat.com>
Mon, 6 May 2013 14:20:03 +0000 (16:20 +0200)
gtk/gtkcssshadowvalue.c

index cf533a1ce63371a4b2905c100d5b18b19dd5f56f..7b6efdc8adc2443c9490e307e78112be188fcf3e 100644 (file)
@@ -475,6 +475,15 @@ _gtk_css_shadow_value_get_geometry (const GtkCssValue *shadow,
     *spread = _gtk_css_number_value_get (shadow->spread, 0);
 }
 
+static gboolean
+has_empty_clip (cairo_t *cr)
+{
+  double x1, y1, x2, y2;
+
+  cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
+  return x1 == x2 && y1 == y2;
+}
+
 static void
 draw_shadow (const GtkCssValue   *shadow,
             cairo_t             *cr,
@@ -483,6 +492,9 @@ draw_shadow (const GtkCssValue   *shadow,
 {
   cairo_t *shadow_cr;
 
+  if (has_empty_clip (cr))
+    return;
+
   shadow_cr = gtk_css_shadow_value_start_drawing (shadow, cr);
 
   cairo_set_fill_rule (shadow_cr, CAIRO_FILL_RULE_EVEN_ODD);
@@ -530,6 +542,12 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue   *shadow,
       cairo_clip (cr);
     }
 
+  if (has_empty_clip (cr))
+    {
+      cairo_restore (cr);
+      return;
+    }
+
   box = *padding_box;
   _gtk_rounded_box_move (&box, x, y);